package cn.gjxblog.core.event;

// 事件专题

/**
 * 1、观察者/被观察者模式
 * jdk1.0 observer observable
 *
 * 2、发布订阅模式
 * jdk1.1 EventListener EventObject
 *
 * 3、Spring中事件模型
 *
 *
 * ApplicationListener 应用监听器
 * 实现JDK1.1 EventListener接口
 *
 * ApplicationEvent  应用事件
 * 继承JDK1.1 EventObject
 *
 * ApplicationEventPublisher 事件发布器
 * ApplicationEventMulticaster 事件广播器
 *
 *ApplicationEventPublisher最终都是委托给ApplicationEventMulticaster去完成的。
 * 当然你也可以自己去实现一个ApplicationEventMulticaster
 *
 * IOC 容器refresh()
 * 第八步： initApplicationEventMulticaster()
 *  向容器注册一个ApplicationEventMulticaster，默认为SimpleApplicationEventMulticaster
 * 第十步： registerListeners()
 *  向容器中所有ApplicationListener添加到ApplicationEventMulticaster中（注意此处并不包括@EventListener标注的注解方法）
 *  发布早期的事件getApplicationEventMulticaster().multicastEvent(earlyEvent);
 * 第十二步： finishRefresh()
 *  发布最后事件 publishEvent(new ContextRefreshedEvent(this));
 *
 *
 * ApplicationListener
 *  GenericApplicationListener
 *  SmartApplicationListener
 *
 * Spring完成监听的两种方式
 * 1、实现ApplicationListener接口
 * 实现applicationListener接口的Bean添加到广播器的时机发生在
 * @see org.springframework.context.support.ApplicationListenerDetector#postProcessAfterInitialization(java.lang.Object, java.lang.String)
 *  ApplicationListenerDetector注入Bean工厂时机
 * @see org.springframework.context.support.AbstractApplicationContext#prepareBeanFactory(org.springframework.beans.factory.config.ConfigurableListableBeanFactory)
 *
 * 2、通过@EventListener注解
 * 注册时机：EventListenerMethodProcessor
 *
 */

